We created a new video streaming app to help you learn about ScyllaDB. This blog covers its features, tech stack, and data modeling. פרסמנו רק אפליקציית דגימה חדשה של ScyllaDB, אפליקציית סטרימינג וידאו. בלוג זה מכסה את המאפיינים של יישום הסטרימינג וידאו, טכנולוגיית טכנולוגיה, ומפרק את תהליך מודל הנתונים. זמין ב-GitHub וידאו סטרימינג Apps האפליקציה יש עיצוב מינימלי עם התכונות החיוניות ביותר של יישום שידור וידאו: רשימה של כל הסרטונים, מסודרים לפי תאריך יצירה (דף הבית) קטעי וידאו שאתם מתחילים לצפות בהם צפו בוידאו צפו בסרטון שבו עזבתם הצג סרגל התקדמות מתחת לכל תמונה קטנה של וידאו טכנולוגיית Stack שפת תכנות: TypeScript מסד נתונים: ScyllaDB NextJS – Page Router (מסלול עמודים) ספריית רכיבים: Material_UI שימוש ב-ScyllaDB עבור יישומים להקלטת וידאו בעלת עיכוב נמוך ScyllaDB הוא מסד נתונים מסוג NoSQL בעל אטימות נמוכה וביצועים גבוהים, תואם עם Apache Cassandra ו-DynamoDB. הוא מתאים היטב להתמודד עם דרישות אחסון נתונים בקנה מידה גדול של יישומי סטרימינג וידאו. ScyllaDB יש נהגים בכל שפות התכנות הפופולריות, וכפי שמדגיש יישום דוגמה זה, הוא משלב היטב עם מסגרות פיתוח אינטרנט מודרניות כמו NextJS. עיכוב נמוך בהקשר של שירותי סטרימינג וידאו הוא קריטי כדי לספק חוויית משתמש חלקה.כדי לשים את הבסיס לביצועים גבוהים, עליך לעצב מודל נתונים שמתאים לצרכים שלך.בואו נמשיך עם תהליך מודל נתונים לדוגמא כדי לראות איך זה נראה. וידאו סטרימינג אפליקציות מודל נתונים ב The , אנו מלמדים כי מודל נתונים NoSQL צריך תמיד להתחיל עם היישום שלך ושאלות קודם.אחר כך אתה עובד אחורה וליצור את התוכנית בהתבסס על השאלות שאתה רוצה להפעיל באפליקציה שלך.התהליך הזה מבטיח שאתה יוצר מודל נתונים שמתאים לשאלות שלך ומלא את הדרישות שלך. קורס מודל נתונים אוניברסיטת ScyllaDB בהתחשב בכך, בואו נדבר על השאלות שהאפליקציה שלנו לסטרימינג וידאו צריכה להפעיל בכל טעינה בדף! תגית: תמשיך לצפות בדף זה, אתה יכול לרשום את כל הוידאו שהם התחילו לצפות.הצג זה כולל את התמונות הקטנות של הווידאו ואת סרגל ההתקדמות מתחת לתמונה הקטנה. Query – get watch progress: SELECT video_id, progress FROM watch_history WHERE user_id = ? LIMIT 9; Schema – watch history table: CREATE TABLE watch_history ( user_id text, video_id text, progress int, watched_at timestamp, PRIMARY KEY (user_id) ); עבור שאלה זו, הגיוני להגדיר 'user_id' כמפתח המקטע, כי זה המסנן שאנו משתמשים בו כדי לשאול את טבלת היסטוריית השעון. זכור כי ייתכן שיהיה צורך לעדכן את התוכנית הזו מאוחר יותר אם יש שאלה הדורשת מסנן בעמדות אחרות מעבר ל- 'user_id'. בנוסף לערך ההתקדמות, האפליקציה צריכה גם להשיג את המטא-נתונים האמיתיים של כל וידאו (לדוגמה, הכותרת והתמונה הקטנה). Query – get video metadata: SELECT * FROM video WHERE id IN ?; שימו לב כיצד אנו משתמשים באופרוטור "IN" ולא "=" כי אנחנו צריכים לקחת רשימה של קטעי וידאו לא רק וידאו יחיד. Schema – video table: CREATE TABLE video ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (id) ); עבור טבלת הווידאו, בואו להגדיר את 'id' כמפתח המחלקה כי זה המסנן היחיד שאנו משתמשים בשאילתה. עמוד הבית: צפו בוידאו אם אתה לוחץ על כל כפתור "צפה", הם יועברו לדף עם שחקן וידאו שבו הם יכולים להתחיל ולהפסיק את הווידאו. Query – get video content: SELECT * FROM video WHERE id = ?; זהו שאלון דומה מאוד לאחד המבוצע בדף המשך צפייה, ולכן, אותה תבנית תתפקד גם עבור שאלון זה. Schema – video table: CREATE TABLE video ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (id) ); תגית: Latest Videos לבסוף, בואו נפרק את דף הווידאו האחרונים ביותר, שהוא דף הבית של היישום.אנחנו לנתח דף זה אחרון כי זה המורכב ביותר מנקודת מבט של מודל נתונים. אנחנו נצטרך להשיג את הסרטונים האלה בשני צעדים: תחילה לקבל את סימני הזמן, ולאחר מכן לקבל את התוכן האמיתי של הסרטון. Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; אתה יכול להבחין כי אנו משתמשים פונקציה מותאמת אישית בשם `top10()`. זה לא פונקציה סטנדרטית ב ScyllaDB. הפונקציה הזו מחזירה קבוצה של תווי זמן 'created_at' האחרונים ביותר בטבלה. זה יכול להיות דרך מצוינת לפתור את האתגרים הייחודיים שלך מודל נתונים. תפקוד משתמש מוגדר יצירת UDF חדש ב- ScyllaDB ניתן להשתמש בערכים אלה כדי לשאול את תוכן הווידאו האמיתי שאנחנו רוצים להציג בדף. Query – get metadata for those videos: SELECT * FROM recent_videos WHERE created_at IN ? LIMIT 10; Schema – recent videos: CREATE MATERIALIZED VIEW recent_videos_view AS SELECT * FROM streaming.video WHERE created_at IS NOT NULL PRIMARY KEY (created_at, id); בתצוגת הווידאו האחרונה, העמודה 'created_at' היא המפתח העיקרי, משום שאנו מסננים על-ידי העמודה הזו בשאילתה הראשונה כדי לקבל את הערכים האחרונים של סימן הזמן. . מחלקה חמה יתר על כן, ה- UI מציג גם סרגל התקדמות קטן מתחת לתמונה הקטנה של כל וידאו המעיד על ההתקדמות שעשית לצפייה בסרטון זה. Query – get watch progress for each video: SELECT progress FROM watch_history WHERE user_id = ? AND video_id = ?; Schema – watch history: CREATE TABLE watch_history ( user_id text, video_id text, progress int, watched_at timestamp, PRIMARY KEY (user_id, video_id) ); ייתכן שתבחין כי לוח ההיסטוריה של השעון שימש כבר בשאילתה הקודמת כדי להשיג נתונים. הפעם, יש לשנות מעט את התבנית כדי להתאים לשאילתה זו. בואו להוסיף 'video_id' כמפתח קבוצתי. עכשיו בואו נראה את התוכנית הסופית של מסד הנתונים! מסד הנתונים הסופי CREATE KEYSPACE IF NOT EXISTS streaming WITH replication = { 'class': 'NetworkTopologyStrategy', 'replication_factor': '3' }; CREATE TABLE streaming.video ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (id) ); CREATE TABLE streaming.watch_history ( user_id text, video_id text, progress int, watched_at timestamp, PRIMARY KEY (user_id, video_id) ); CREATE TABLE streaming.recent_videos ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (created_at) ); הפונקציה המוגדרת על-ידי המשתמש עבור דף הסרטים האחרונים ביותר -- Create a UDF for recent videos CREATE OR REPLACE FUNCTION state_f(acc list<timestamp>, val timestamp) CALLED ON NULL INPUT RETURNS list<timestamp> LANGUAGE lua AS $$ if val == nil then return acc end if acc == nil then acc = {} end table.insert(acc, val) table.sort(acc, function(a, b) return a > b end) if #acc > 10 then table.remove(acc, 11) end return acc $$; CREATE OR REPLACE FUNCTION reduce_f(acc1 list<timestamp>, acc2 list<timestamp>) CALLED ON NULL INPUT RETURNS list<timestamp> LANGUAGE lua AS $$ result = {} i = 1 j = 1 while #result < 10 do if acc1[i] > acc2[j] then table.insert(result, acc1[i]) i = i + 1 else table.insert(result, acc2[j]) j = j + 1 end end return result $$; CREATE OR REPLACE AGGREGATE top10(timestamp) SFUNC state_f STYPE list<timestamp> REDUCEFUNC reduce_f; זה אבל אתה יכול גם כדי ליצור את הפונקציה, הקפד לאפשר UDFs בקובץ הגדרות scylla.yaml (מקום: /etc/scylla/scylla.yaml): UDF משתמש Lua שימוש ב-Wasm כדי ליצור UDFs ב-ScyllaDB לקלונן את הרפאו ולהתחיל! כדי להתחיל... להוריד את התיקייה: git clone https://github.com/scylladb/video-streaming https://github.com/scylladb/video-streaming להגדיר את התמכרות: npm install Modify the configuration file: APP_BASE_URL="http://localhost:8000" SCYLLA_HOSTS="172.17.0.2" SCYLLA_USER="scylla" SCYLLA_PASSWD="xxxxx" SCYLLA_KEYSPACE="streaming" SCYLLA_DATACENTER="datacenter1" Migrate the database and insert sample data: npm run migrate הפעל את השרת: npm run dev חבילות up אנו מקווים שאתם נהנים מהאפליקציה שלנו לסטרימינג וידאו וזה עוזר לך לבנות יישומים עם עיכוב נמוך וביצועים גבוהים עם ScyllaDB. איפה יש קורסים חופשיים , אם יש לך שאלות לגבי אפליקציית דגימת הזרמת וידאו או ScyllaDB, אז בואו נדבר! אוניברסיטת ScyllaDB מודל נתונים נהגים ScyllaDB בואו לפורום שלנו יישומים נוספים של ScyllaDB sample: IOT - IOT Cloud Getting Started מדריך חנות Feature משאבים רלוונטיים : עקבו אחרי GitHub repository GitHub repository תגית: ScyllaDB כיצד ScyllaDB Aggregates Distributed להפחית את זמן ביצוע שאילתות עד 20X Wasmtime: תמיכה UDFs ב ScyllaDB עם WebAssembly תיעוד ScyllaDB ScyllaDB מתחיל ScyllaDB מתחיל אודות Attila Tóth הוא תומך בפיתוח ב-ScyllaDB. הוא כותב מדריכים ופרסומים בבלוג, מדבר באירועים, יוצר דמויות ויישומים דוגמנית כדי לעזור למפתחים לבנות יישומים ביצועים גבוהים. אטילה טוטה